home *** CD-ROM | disk | FTP | other *** search
/ Amiga Game-Power / Amiga Game-Power.iso / anwendungen / gw print / structurebrowser_v1.3 / sources / sbio.c < prev    next >
C/C++ Source or Header  |  1994-05-20  |  9KB  |  358 lines

  1. /*
  2.    this file does all the intuition-related user I/O stuff;
  3.    displaying the menu options and getting input
  4. */
  5.  
  6. #include "header/sb.h"
  7.  
  8. #define CHOICEWIDTH     280
  9. #define CHOICEHEIGHT      8
  10. #define SPACING           9
  11. #define TOPGADG          30
  12. #define TWGADG         (MAXGADG + 1)
  13.  
  14. #define PUTTEXT(text, x, y) { Move(rp, (long)x, (long)y); \
  15.                               Text(rp, text, (long)strlen(text)); }
  16.  
  17. struct IntuitionBase *IntuitionBase = NULL;
  18. struct GfxBase *GfxBase = NULL;
  19. struct Window *OpenWindow(), *MainWindow = NULL;
  20. struct RastPort *rp;
  21. extern int level;
  22. APTR OpenLibrary();
  23. struct IntuiText ChoiceText[MAXGADG + 1];
  24. struct Gadget ChoiceGadg[MAXGADG + 1];
  25.  
  26. struct IntuiText BackIText = {
  27.    3, 2, JAM2,
  28.    5, 2,
  29.    NULL, NULL, NULL
  30. };
  31.  
  32. struct IntuiText MoreIText = {
  33.    2, 3, JAM2,
  34.    5, 2,
  35.    NULL,
  36.    (UBYTE *)"(MORE)",
  37.    NULL
  38. };
  39.  
  40. struct IntuiText twIText = {
  41.    3, 2, JAM2,
  42.    5, 2,
  43.    NULL,
  44.    (UBYTE *)"Tiny Window",
  45.    NULL
  46. };
  47.  
  48. struct Gadget TWGadg = {
  49.    NULL,
  50.    520, -12, 110, 12,
  51.    GADGHCOMP | GRELBOTTOM,
  52.    RELVERIFY,
  53.    BOOLGADGET,
  54.    NULL, NULL, &twIText,
  55.    NULL, NULL,
  56.    TWGADG, NULL
  57. };
  58.  
  59. struct Gadget BackGadg = {
  60.    NULL,
  61.    10, -12, 140, 12,
  62.    GADGHCOMP | GRELBOTTOM,
  63.    RELVERIFY,
  64.    BOOLGADGET,
  65.    NULL, NULL, &BackIText,
  66.    NULL, NULL,
  67.    0, NULL  /* gadget ID is zero */
  68. };
  69.  
  70. struct Gadget MoreGadg = {
  71.    NULL,
  72.    300, -12, 59, 12,
  73.    GADGHCOMP | GRELBOTTOM,
  74.    RELVERIFY,
  75.    BOOLGADGET,
  76.    NULL, NULL, &MoreIText,
  77.    NULL, NULL,
  78.    MOREGADG, NULL
  79. };
  80.  
  81. struct NewWindow NWindow = {
  82.    0, 10, 640, 189,        /* left, top, width, height     */
  83.    -1, -1,                 /* use screen colours           */
  84.    GADGETUP                /* IDCMP flags                  */
  85.     | CLOSEWINDOW,
  86.    WINDOWDEPTH             /* window flags                 */
  87.     | WINDOWCLOSE
  88.     | WINDOWDRAG
  89.     | RMBTRAP
  90.     | ACTIVATE
  91.     | NOCAREREFRESH
  92.     | SMART_REFRESH,
  93.    &BackGadg,              /* first gadget in list         */
  94.    NULL,
  95.    (UBYTE *)"The Transactor Structure Browser V 1.3",
  96.    NULL, NULL,
  97.    0, 0, 0, 0, /* sizing limits (non-resizable) */
  98.    WBENCHSCREEN
  99. };
  100.  
  101.  
  102. static struct Gadget WakeUpGadget =
  103. {
  104.    NULL,                         /* address of next gadget        */
  105.    2, 10, 116, 10,               /* left, top, width, height      */
  106.    GADGHNONE,                    /* flags - no highlighting       */
  107.    RELVERIFY,                    /* activation flags              */
  108.    BOOLGADGET,                   /* gadget type                   */
  109.    NULL,                         /* no imagery                    */
  110.    NULL,                         /* no alternate imagery          */
  111.    NULL,                         /* no text                       */
  112.    0,                            /* mutual exclude                */
  113.    NULL,                         /* SpecialInfo                   */
  114.    0,                            /* gadget ID                     */
  115.    NULL,                         /* user data                     */
  116. };
  117.  
  118. struct NewWindow TWindow = {
  119.    480, 60, 120, 20,    /* left, top, width, height   */
  120.     -1, -1,             /* detail pen, block pen      */
  121.    GADGETUP,            /* IDCMP flags                */
  122.    WINDOWDRAG           /* Window flags               */
  123.    | WINDOWDEPTH,
  124.    &WakeUpGadget,       /* application gadget list    */
  125.    NULL,                /* special checkmark imagery  */
  126.    (UBYTE *)"SB",       /* window title               */
  127.    NULL,                /* custom screen pointer      */
  128.    NULL,                /* super bitmap pointer       */
  129.    0, 0, 0, 0,          /* min/max width and height   */
  130.    WBENCHSCREEN         /* screen type                */
  131. };
  132.  
  133.  
  134. SetupGadg ()
  135. {
  136. int i;
  137.  
  138.    for (i = 0; i < MAXGADG; i++)
  139.    {
  140.       ChoiceText[i].BackPen    = 0;
  141.       ChoiceText[i].DrawMode   = JAM2;
  142.       ChoiceText[i].LeftEdge   = 0;
  143.       ChoiceText[i].TopEdge    = 0;
  144.       ChoiceText[i].ITextFont  = NULL;
  145.       ChoiceText[i].IText      = NULL;
  146.       ChoiceText[i].NextText   = NULL;
  147.       ChoiceGadg[i].LeftEdge   = 20;
  148.       ChoiceGadg[i].TopEdge    = i * SPACING + TOPGADG;
  149.       ChoiceGadg[i].Width      = CHOICEWIDTH;
  150.       ChoiceGadg[i].Height     = CHOICEHEIGHT;
  151.       ChoiceGadg[i].Flags      = GADGHCOMP;
  152.       ChoiceGadg[i].Activation = RELVERIFY;
  153.       ChoiceGadg[i].GadgetType = BOOLGADGET;
  154.       ChoiceGadg[i].GadgetText = &ChoiceText[i];
  155.       ChoiceGadg[i].GadgetID   = i + 1; /* gadget IDs start at 1 */
  156.    }
  157. }
  158.  
  159.  
  160. GetChoice (num)
  161. int num;
  162. {
  163. struct IntuiMessage *GetMsg(), *message;
  164. ULONG  msgclass;              /* message class from IDCMP      */
  165. APTR   IAddr;                 /* pointer to gadget from IDCMP  */
  166. int id;                       /* gadget ID of selected gadget  */
  167. int tflag = FALSE;
  168.  
  169.    Redisplay(num);             /* put up choices in window      */
  170.  
  171.    FOREVER                     /* main event loop               */
  172.    {
  173.       Wait (1L << MainWindow->UserPort->mp_SigBit);
  174.  
  175.       while (message = GetMsg(MainWindow->UserPort))
  176.       {
  177.          /* get what we need from the message port */
  178.          msgclass = message->Class;
  179.          IAddr    = message->IAddress;
  180.          ReplyMsg(message);    /* reply to message right away   */
  181.  
  182.          /* check for gadget selected */
  183.          if (msgclass == GADGETUP)
  184.          {
  185.             id = ((struct Gadget *)IAddr)->GadgetID;
  186.             
  187.             if (id == TWGADG)
  188.                tflag = TRUE;
  189.             else
  190.                return id;
  191.          }      
  192.          /* finish up if the close gadget is clicked */
  193.          else if (msgclass == CLOSEWINDOW)
  194.             CloseOut(); /* clean up and exit */
  195.       }
  196.       
  197.       if (tflag)
  198.       {
  199.          tflag = FALSE;
  200.          CloseWindow(MainWindow);
  201.          DoTinyWindow();
  202.          if ((MainWindow = OpenWindow(&NWindow)) == NULL)
  203.             CloseOut();
  204.          rp = MainWindow->RPort; /* rastport for graphics routines */
  205.          return TWGADG;
  206.       }
  207.    }
  208. }
  209.  
  210.  
  211. DoTinyWindow()
  212. {
  213. struct Window *w;
  214. struct IntuiMessage *GetMsg(), *message;
  215.  
  216.    MainWindow = NULL;
  217.  
  218.    if (PostMe("StructureBrowser"))
  219.       return;
  220.       
  221.    if ((w = OpenWindow(&TWindow)) == NULL)
  222.       CloseOut();
  223.    Wait (1L << w->UserPort->mp_SigBit);
  224.    
  225.    while (message = GetMsg(w->UserPort))
  226.       ReplyMsg(message);
  227.  
  228.    TWindow.LeftEdge = w->LeftEdge;
  229.    TWindow.TopEdge  = w->TopEdge;
  230.    
  231.    CloseWindow(w);
  232. }
  233.  
  234.    
  235. /* putHeader
  236.  
  237.    put title and pointer at top of screen -
  238.    if ptr is NULL, put string only.
  239. */
  240.  
  241. putHeader (string, ptr)
  242. char *string;
  243. APTR ptr;
  244. {
  245. char buf[80];
  246.  
  247.    SetAPen(rp, 0L);
  248.    RectFill(rp, 1L, 10L, (long)MainWindow->Width-25, 27L);
  249.    SetAPen(rp, 3L);
  250.  
  251.    if (ptr)
  252.    {
  253.       sprintf(buf, "%d: %s (address $%lx):", level, string, ptr);
  254.       PUTTEXT(
  255.        " Member         Type                    Value (hex/decimal)",
  256.        20L, 10L + 2 * rp->TxHeight);
  257.    }
  258.    else
  259.       sprintf(buf, "%d: %s:", level, string);
  260.  
  261.    PUTTEXT(buf, 20L, 10L + rp->TxHeight);
  262. }
  263.  
  264.  
  265. OpenStuff ()
  266. {
  267.    if (!(IntuitionBase = (struct IntuitionBase *)
  268.                   OpenLibrary ("intuition.library", 0L) ) )
  269.       CloseOut();
  270.  
  271.    if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L) ))
  272.       CloseOut();
  273.       
  274.    twmInit();
  275.  
  276.    /* now attempt to open the main window */
  277.    if (!(MainWindow = OpenWindow(&NWindow)) )
  278.       CloseOut();
  279.  
  280.    rp = MainWindow->RPort; /* rastport for graphics routines */
  281. }
  282.  
  283.  
  284. CloseOut ()
  285. {
  286.    twmCleanUp();
  287.  
  288.    if (MainWindow)    CloseWindow(MainWindow);
  289.    if (IntuitionBase) CloseLibrary(IntuitionBase);
  290.    if (GfxBase)       CloseLibrary(GfxBase);
  291.  
  292.    exit(0);     /* exit program - we may be deeply nested */
  293. }
  294.  
  295. /* Redisplay
  296.  
  297.    Clear window, remove old gadgets, prepare and add new ones
  298. */
  299.  
  300. Redisplay (num)
  301. int num;
  302. {
  303. struct Gadget *gadg;
  304. BOOL MoreFlag = FALSE;
  305. int i, c;
  306.  
  307.    /* rectfill with background colour to clear */
  308.    SetAPen(rp, 0L);
  309.    RectFill(rp, 1L, (long)TOPGADG, (long)MainWindow->Width - 2,
  310.             (long)MainWindow->Height - 2);
  311.  
  312.    if (num > MAXGADG)
  313.    {
  314.       num = MAXGADG;
  315.       MoreFlag = TRUE; /* put up "more" gadget */
  316.    }
  317.    /* remove all choice gadgets */
  318.    gadg = &BackGadg;
  319.    while(gadg = gadg->NextGadget)
  320.       RemoveGadget(MainWindow, gadg);
  321.  
  322.    /* render gadgets according to single-digit code at
  323.       the start of the gadgets's intuitext
  324.    */
  325.    for (i = 0; i < num; i++)
  326.    {
  327.       ChoiceText[i].FrontPen = 1;
  328.       if ((c = *ChoiceText[i].IText) == '-' || c == '(')
  329.       {
  330.          if (c == '-')
  331.          {
  332.             *ChoiceText[i].IText = ' ';
  333.             ChoiceText[i].FrontPen = 2;
  334.          }
  335.          PrintIText(rp, &ChoiceText[i],
  336.                    (long)ChoiceGadg[i].LeftEdge,
  337.                    (long)ChoiceGadg[i].TopEdge);
  338.       }
  339.       else
  340.          AddGadget(MainWindow, &ChoiceGadg[i], -1L);
  341.    }
  342.    if (MoreFlag)
  343.       AddGadget(MainWindow, &MoreGadg, -1L);
  344.    
  345.    AddGadget(MainWindow, &TWGadg, -1L);
  346.  
  347.    /* display gadget imagery (the text) */
  348.    RefreshGadgets(&BackGadg, MainWindow, NULL);
  349. }
  350.  
  351.  
  352. SetBackText (sflag)
  353. int sflag;
  354. {
  355.    BackIText.IText = (UBYTE *)(sflag ?
  356.          " Previous  Page " : " Previous Level ");
  357. }
  358.